#ifndef __BASIC_MAIL_H__
#define __BASIC_MAIL_H__

#include <basic/skt.h>

__BEGIN_DECLS

#define MAIL_MAX_SENDER_NUM         10

#define MAIL_MAX_ATTACH_NUM         10
#define MAIL_MAX_ATTACH_SIZE        MB(2)
#define MAIL_MAX_ATTACH_TOTAL_SIZE  MB(10)

struct _smtp
{/*{{{*/
    struct host_addr_info addrinfo;
    SKT skt;
    enum { _NOAUTH_, _LOGIN_, _PLAIN_ } auth;
    char sender[NAME_SIZE+1];

    char *_readbuf;
    char *_writebuf;
    int _writebuf_size;
};/*}}}*/
typedef struct _smtp *SMTP;

/*
 * 创建接口
 */
extern int  /* 0:成功 -1:对话出错 -2:读SMTP状态出错 -3:SMTP状态错误
               -4:SMTP需要验证而缺少用户/密码
               LOGIN -5:AUTH LOGIN出错 -6:用户输入出错 -7:密码输入出错
               PLAIN -8:AUTH PLAIN出错
               -9: HELO出错 */
smtp_create(
        char *host_addr,        /* [IN] 主机地址
                                   (user:passwd@host:port) */
        SMTP *psmtp             /* [OUT] 接口 */
        );

/*
 * 销毁接口
 */
extern void
smtp_destroy(
        SMTP smtp               /* [IN] 接口 */
        );

/*
 * 发出HELLO
 */
extern int  /* 0:成功 -1:对话出错 -2:读SMTP状态出错 -3:SMTP状态错误
               -4:HELO出错 -5:EHLO出错
               LOGIN -6:AUTH LOGIN出错 -7:用户输入出错 -8:密码输入出错
               PLAIN -9:AUTH PLAIN出错 */
smtp_hello(
        SMTP smtp               /* [IN] 接口 */
        );

/*
 * 发送
 */
extern int  /* 0:成功 -1:对话出错 -2:解析发送地址出错
               -3:附件状态错误 -4:附件大小超出限制 -5:base64编码出错
               -6:全部附件大小超出限制
               -7:MAIL FROM出错 -8:RCPT FROM出错 -9:DATA出错
               -10:写附件头出错 -11:写附件出错
               -12:.出错 -13:RSET出错 */
smtp_send(
        SMTP smtp,              /* [IN] 接口 */
        char *mailto,           /* [IN] 接收地址 */
        char *mailfrom,         /* [IN] 发送地址 */
        char *replyto,          /* [IN] 回复地址 NULL:同发送地址 */
        char *subject,          /* [IN] 标题 */
        char *body,             /* [IN] 信体 */
        char *attach[]          /* [IN] 附件 以attach[n]==NULL为结束 */
        );

/*
 * 退出
 */
extern int  /* 0:成功 -1:对话出错 -2:QUIT出错 */
smtp_quit(
        SMTP smtp               /* [IN] 接口 */
        );

/*
 * 快速发送(包含hello,send,quit)
 */
extern int  /* smtp_hello错误码 -100+smtp_send错误码 */
smtp_quick_send(
        SMTP smtp,              /* [IN] 接口 */
        char *mailto,           /* [IN] 接收地址 */
        char *mailfrom,         /* [IN] 发送地址 */
        char *replyto,          /* [IN] 回复地址 NULL:同发送地址 */
        char *subject,          /* [IN] 标题 */
        char *body,             /* [IN] 信体 */
        char *attach[]          /* [IN] 附件 以attach[n]==NULL为结束 */
        );

__END_DECLS

#endif
